Die seriellen Schnittstellen (ASCI und CSI/O) des HD64180

Gerald Schröder

Der HD64180 stellt drei serielle Schnittstellen zur Verfügung. Bei zweien
handelt es sich um "Asynchronous Serial Connection Interfaces" (wie
RS-232/V24) und die dritte heißt "C1ocked Serial Input/Output".


Aschronous Serial Communication Interfces

Aufgabe dieser beiden Scbnittstellen ist die serielle Verbindung zu einem
Modem, Termial, (RS-232-)Drucker o.Ä. Zusätzlich gibt es einen "Multipro-
zessor-Modus", mit dem sich leicht ein System mit mehreren HD64180s auf-
bauen ließe, wobei die ASCIs dann als (Verbindung zum) System-Bus dienen
würden.

Jeder Kanal belegt 5 Ports: einen zum Lesen und einen zum Scbreiben der
Daten, einen für den Status (Zustand) des Kanals, zwei für die Einstellung
des Kanals (Baudrate usw.) und einige Zusatz-Informationen. Die Kanäle
unterscheiden sich in einigen Features, was ich aber jeweils anmerken
werde.

Die einzelnen Ports (Kanal 0 und Kanal 1):

Name	Port  Bezeichnung
CNTLA0	0     Control Register A Channel 0
CNTLB0	2     Control Register B Channel 0
STAT0	4     Status Register Channel 0
TDR0	6     Transmit Data Register Channel 0
RDR0	8     Receive Data Register Channel 0
CRTLA1	1     Control Register A Channel 1
CRTLB1	3     Control Register B Channel 1
STAT1	5     Status Register Channel 1
TDR1	7     Transmit Data Register Channel 1 
RDR1	9     Receive Data Register Channel 1


Die einzelnen Bits der Ports:

CNTLA  (Control A)

7    6    5    4                3            2      1      0
MPE  RE   TE   Kanal 0: RTS=*   Read: MPBR   MOD2   MOD1   MOD0
               Kanal 1: CKA1D   Write: EFR

MPE   = Multiprocessor Mode Enable
RE    = Receiver Enable
TE    = Transmitter Enable
RTSO* = Request To Send Channel 0 (aktiv Low, nur Kanal 0!)
CKA1D = Asynchronous Clock Channel 1 Disable (nur Kanal 1!)
MPBR  = Multiprocessor Bit Receive (nur beim Lesen!)
EFR   = Error Flag Reset (rur beim Schreiben!)
MODx  = ASCII Data Format Mode

Anmerkung: Bit 4 (D4) hat bei Kanal 0 eine andere Bedeutung als bei Kanal
1. Bit 3 (D3) bedeutet beim Schreiben etwas anderes als beim Lesen.

CNTLB  (Control B)
7     6    5          4    3    2    1    0
MPBT  MP   Read: CTS* PEO  DR   SS2  SS1  SS0
           Write: PS

MPBT  = Multiprocessor Bit Transmit
MP    = Multiprocessor Mode
CTS   = Clear To Send (nur beim Lesen!)
PS    = Prescale (nur beim Scbreiben!)
PEO   = Parity Evea/Odd
DR    = Divide Ratio
SSx   = Source/Speed Select


STAT (Status)
7     6     5   4   3    2               1
RDRF  OVRN  PE  FE  RIE  Kanal 0: DCD0*  TDRE  TIE
                         Kanal 1: CTS1E

RDRF  = Receive Data Register Full (nur lesbar)
OVRN  = Overrun Error (nur lesbar)
PE    = Parity Error (nur lesbar)
FE    = Framing Error (nur lesbar)
RIE   = Receive Interrupt Enable
DCD0* = Data Carrier Detect (aktiv Low, nur lesbar, nur Kanal 0!)
CTS1E = Clear To Send Channel 1 Enable (nur Kanal 1!)
TDRE  = Transmit Data Register Empty (nur lesbar)
TIE   = Transmit Interrupt Enable


Einstellung der Kanäle

Über CNTLB wird die Baudrate, der Multiprozessor-Mode und die Parität
festgelegt. D0 bis D3 und D5 sind für die Baudrate zuständig. Sie legen
fest, durch welche Werte die Taktfrequenz geteilt wird.

D5  1.Teiler  D3  2.Teiler  D2 D1 D0  3.Teiler
0   10        0   16        0  0  0    1
1   20        1   64        0  0  1    2
                            0  1  0    4
                            0  1  1    8
                            1  0  0   16
                            1  0  1   32
                            1  1  0   64
                            1  1  1   externer Takt

Der externe Takt wird von den Pins CKA0 (gemultiplext mit DREQ0*) bzw.
CKA1 (gemultiplext mit TENDt) abgenommen, wobei sich die Baudrate aus dem
externen Takt geteilt durcb 16 oder 64 (abhängig von D3) eribt. Dies ist
der Reset-Zustand. Falls die Baudrate vom System-Takt abgeleitet wird, wird
der resultierende Takt über CKA0/1 ausgegeben!

Zwei Rechenbeispiele (bei einem Systemtakt von 9,216 MHz):
19200 Baud: 19200 = 9.316.000 DIV 30 DIV 16 DIV  1 => D5-D0 = 1x0000
  300 Baud:   300 = 9.216.000 DIV 30 DIV 64 DIV 16 => D5-D0 = 1x1100

D4 ist für die Art der Parität zuständig, falls Paritäts-Prüfung gewünscht
wird: D4=0: gerade Parität (EVEN);  D4=1: ungerade Parität (ODD).

Zu guter Letzt D6 und D7, die für den Multiprozessor-Modus zuständig sind:
Wenn D6=1, dann wird statt des Paritäts-Bits ein Multiprozessor-Bit gesen-
det/empfangen. Wenn D7=1, wird beim Seden das Multiprozessor-Bit auf 1
gesetzt. Das könnte z.B. bedeuten; "Achtung, an alle anderen Prozessoren,
es kommt was für alle!"


Weitere Einstellungen erfolen über CNTLA. Mit D2 bis D0 wird das Daten-
format festgelegt:

Bit    bedeutet
D2=0   7-Bit-Daten
  =1   8-Bit-Daten
D1=0   keine Parität
  =1   Paritt
D0=0   1 Stopit
  =1   2 Stop-Bits

Wenn D3 mit 0 beschrieben wird, werden alle Fehlermeldungen für diesen
Kanal (im Register STAT0/1) gelöscht. Mit D4 kann bei Kanal 0 der Pin RTS0*
gesetzt/gelöscht werden (Request to Send = Gegenseite darf senden). Bei
Kanal 1 hingegen erfolgt hier die Auswahl, ob der Pin CKA1/TEND0* als Takt-
eingang (CKA1, D4=0) oder als Kennung für das Ende eines Blocktransfers
(TEND0,  D4=1) benutzt wird.

Mit D5 wird der Sender ein/ausgeschaltet, mit D6 der Empfänger. D7 hat nur
i Multiprozessor-Modus  eine Funktion. Wenn n D7=1, werden nur Daten  mit
gesetztem MPB-Bit (s. D7 in CNTLB) angenommen, z.B. im Modus: "Empfange
nur Daten für alle Prozessoren!". Bei D7=0 werden alle Daten angenomme. So
ist folgende Kommunikation denkbar: Der Master-Prozessor sendet an alle
Prozessare durch gesetztes MPB-Bit gekennzeichnet, welche beiden Przes-
soren sich unterhalten dürfen. Diese schalten dann D7 auf 0 und wickeln
ihre Kommunikation ohne MPB-Bit ab. Dann schalten  sie D7 auf 1 und der
Master-Prozessor wird benachrichtigt, die Sache wieder zu übernehen.

Zu guter Letzt noch die Einstellungen, die über das Status-Register STAT
vorgenommen werden. D0 legt fest, ob ein Interrupt erfolgt, wenn der Kanal
sedebereit ist. Wenn D3=1, wird auch ein Interrupt ausgelöst, wenn ein
Zeichen emfangen wurde oder ein Fehler auftrat. Bei Kanal 1 kann über D2
ausgewählt werden, ob der Pin CTS1*/RXS als CTS* (D2=1, Clear TO Send =  
HD64180 darf senden oder als Daten-Epfangs-Pin für CSI/0  (D2=0) dient.


Senden/Empfangen

Der Stats des Kanals kann über STAT befragt werden. D1=1 bedetet, daß
Daten gesedet werden dürfen. Wenn dann ein Byte in das Sende-Register
TDR geschrieben wird, geht D1 auf 0, bis das Zeichen gesendet wurde.

D7=1 bedeutet, daß ein Zeichen empfangen wurde und jetzt aus dem Empfangs-
Register RDR gelesen werden kann oder daß bei Empfangen ein Fehler auf-
getreten ist. Nach dem Lesen des Bytes aus RDR wird D7 gelöscht. Folgende
Fehler werden erkannt:
D6  Overrun  (letztes Byte wurde nicht schnell genug aus RDR geholt)
D5  Parity   (das Paritäts-Bit des Zeichens warfalsch)
D4  Framing  (das/die Stop-Bits stimmten nicht)

Falls ein Febler auftrat, muß dieser gelöscht werden, indem D3 von CNTLLA
mit 0 beschrieben wird. Achtung: dabei werden dann auch die anderen Ein-
stellungen von CNTLA  geändert!

Über D2 aus STAT kann bei Kanal 0 noch der Zustand des Signals "Data
Carrier Detect" abgefragt werden. D2 wird auf 1 gesetzt, wenn das Signal am
Pin DCD0* irgendwann mal HIGH war oder noch ist. D2 wird nach dem Lesen auf
0 gesetzt, wenn inzwischen DCD0*=0 ist. Solange D2=1, wird nichts empfan-
gen. Diese Verbindung ist nur bei bestimmten Modems sinnvoll.

Über D3 aus CTNLA kann das Multiprozessor-Bit des letzten empfangenen
Bytes abgefragt werden. D5 aus CNTLA gibt Ausunft über den Zustand des
Pins CTS*. Für Kanal 0 gilt, daß der Kanal erst sendebereit wird STA0,
D1=1), wenn der Pin CTS0*=0. CTS1 kann nur abgefragt werden und hat nur
einen Einfluß auf die Sedebereitschaft, wenn D2 aus STAT1 auf 1 gesetzt wurde (CTS1E = CTS-Enable Kanal 1).


Clocked Serial Input Output

Diese Schnittstelle dient zur Verbindung mehrerer Prozessoren, wobei die
anderen Prozessoren nicht unbedigt HD6480s sein mssen. Aber sie müssen
über eine gemeinsame (sychronisierte) Taktauelle verfügen und die Sende-/
Empfangs-Operation muß in beiden Prozessoren gleichzeitig beginnen!

Der HD64180 kann nicht gleichzeitig empfangen und seden. Es gibt nur ein
Sede/Empfangregister: TRDR (Transmit/Receive Data Register), Port 0Bh.
Es sind auch nur einige Einstellungen möglich, so daß nur ein Kontroll-
Regiser nötig ist: CNTR (Control), Port 0Ah. Der Aufbau dieses Registers:

CNTR  (Control)

7    6    5    4    3    2    1    1
--------------------------------------
EF   EIE  RE   TE   -    SS2  SS1  SS0

EF  = End Flag  (nur lesbar)
EIE = End Interrupt Enable
RE  = Receive Eable
TE  = Transit Enable
SSx = Speed Select

Einstellungen

Es kann nur die Baudrate eingestellt werden. Wenn die Baudrate neu gesetzt
wird, sollte nicht gleicheitig ein Sende-/Empfaggs-Zyklus (s.u. gestartet
werden. Der  System-Takt wird durch die folenden Werte geteilt (bier für
9.216 MHz):

SS2 SS1 SS0 Teiler  ergibt Baudrate
-----------------------------------
0   0   0     20      460800
0   0   1     40      230400
0   1   0     80      115200
0   1   1    160       57600
1   0   0    320       28800
1   0   1    640       14400
1   1   0   1280        7200
1   1   1   externer Takt  (kleiner als 460800)

Bei 111 wird der extere Takt über den Pin CKS eingelesen; asonsten
wid der resultierende Takt hier ausgegeben.

Empfangen/Senden

Zuerst muß abgefragt werden, ob der Sender gerade aktiv ist. Erst wenn D7
aus CNTR gesetzt ist, kann die Operation beginnen. Zum Senden wird  das
Byte in TRDR geschrieben und dann D4 in CNTR gesetzt. Gleichzeitig wird
die Bauarate (wieder) gesetzt. Sie sollte aber nicht verändert werden, da
es sonst Sende-Probleme geben kann. Die Operation ist erst beendet, wenn D7
wieder auf 1 geht. Falls D6 gesetzt wurde, wird dann ein Interrupt ausge-
löst.

Beim Empfangen wird D5 gesetzt (zusammen mit der Baudrate). Nun beginnt
der Empfangs-Vorgang, der immer gleich lang dauert. Wenn D7 wieder auf 1 
geht, kann das Byte aus TRDR gelesen werden. Wenn vor dem  Empfangen  D6
gesetzt wurde, wird ein Interrupt ausgelöst, sobald D7 auf 1 springt. Es
ist zu beachten, daß der Empfangs-Pin (RXS) mit CTS* für Kanal 1 gemulti-
plext ist. Vor dem Empfang muß also über D2 von STAT1 die Funktion "Pin
RXS/CTS1* als RXS* ausgewählt werden.